package zhouyang;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

class BankAccount{
    String bankName ="ccb";
//    以一种线程安全的方式操作非线程安全对象内的某些字段
//    1.更新对象属性必须使用public volatile修饰符
    public volatile int money = 0;
//    2.因为对象的属性修改类型预阿妮类都是抽象类，所以每次使用都必须
//    使用静态方法newUpdater()创建一个更新器，并且需要设置想要更新的类和属性
    AtomicIntegerFieldUpdater fieldUpdater = AtomicIntegerFieldUpdater.newUpdater(BankAccount.class,"money");
    public void transfer(BankAccount bankAccount){
        fieldUpdater.incrementAndGet(bankAccount);
    }
}
public class AtomicIntegerFieldUpdaterDemo {
    public static void main(String[] args) {
    BankAccount bankAccount = new BankAccount();
        for (int i = 1; i <=1000; i++) {
            new Thread(()->{
                bankAccount.transfer(bankAccount);
            },String.valueOf(i)).start();
        }
        try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
        System.out.println(Thread.currentThread().getName()+"\t"+"---bankAccount:"+bankAccount.money);
    }
}
